package com.example.aboutreview;

import lombok.Getter;
import org.junit.Test;

public class StaticUse {


    static final String name;
    static final Integer age;

    /*
    静态代码块定义在类中方法外, 静态代码块在非静态代码块之前执行(静态代码块 —> 非静态代码块 —> 构造方法)。
    该类不管创建多少对象，静态代码块只执行一次.
    一个类中的静态代码块可以有多个，位置可以随便放，它不在任何的方法体内，JVM加载类时会执行这些静态的代码块，
    如果静态代码块有多个，JVM将按照它们在类中出现的先后顺序依次执行它们，每个代码块只会被执行一次。
     */
    static {
        name = "yuyixi";
        age = 28;
    }

    @Test
    public void 静态块的实现() {
        System.err.println(name);
        System.err.println(age);
    }

    /**
     * 静态内部类与非静态内部类之间存在一个最大的区别，我们知道非静态内部类在编译完成之后会隐含地保存着一个引用，
     * 该引用是指向创建它的外围类，但是静态内部类却没有。没有这个引用就意味着：
     * 它的创建是不需要依赖外围类的创建。
     * 它不能使用任何外围类的非static成员变量和方法。
     */
    private StaticUse() {
    }

    public static class Holder {
        private static final StaticUse INSTANCE = new StaticUse();

    }

    public static StaticUse getInstance() {
        return Holder.INSTANCE;
    }


    public static void main(String[] args) {
        单利测试();
    }
    public static void 单利测试(){
        StaticUse instance = getInstance();
        StaticUse instance1 = getInstance();
        System.err.println(instance==instance1);
    }


    /**
     * 静态方法属于类本身，非静态方法属于从该类生成的每个对象。 如果您的方法执行的操作不依赖于其类的各个变量和方法，
     * 请将其设置为静态（这将使程序的占用空间更小）。 否则，它应该是非静态的。
     */

    /**
     * 静态代码块与{}非静态代码块(构造代码块)
     * 相同点： 都是在JVM加载类时且在构造方法执行之前执行，在类中都可以定义多个，
     * 定义多个时按定义的顺序执行，一般在代码块中对一些static变量进行赋值。
     *
     * 不同点： 静态代码块在非静态代码块之前执行(静态代码块 -> 非静态代码块 -> 构造方法)。
     * 静态代码块只在第一次new执行一次，之后不再执行，而非静态代码块在每new一次就执行一次。
     * 非静态代码块可在普通方法中定义(不过作用不大)；而静态代码块不行。
     */





}
